# Функция генератор, оператор yield

"""
Функция-генератор в Python позволяет создавать итераторы с использованием оператора yield. 
Генераторы предоставляют удобный способ создания итерируемого объекта, который может генерировать значения по запросу, 
вместо того чтобы хранить все значения в памяти сразу.
"""


# Давайте рассмотрим пример простого генератора, который генерирует последовательность чисел от 1 до N:
def number_generator(N):
    i = 1
    while i <= N:
        yield i
        i += 1


for number in number_generator(5):
    print(number)

"""
В этом примере мы определяем функцию number_generator, которая принимает аргумент N. 
Затем мы используем оператор yield, чтобы вернуть значение i на каждой итерации цикла while. 
Когда оператор yield достигается, выполнение функции приостанавливается, и значение i возвращается в 
качестве следующего элемента последовательности. При следующем вызове генератора 
выполнение продолжается с того места, где оно было приостановлено, и цикл while продолжает 
генерировать следующие значения, пока не достигнет значения N.В этом примере мы используем цикл for 
для итерации по значениям, возвращаемым генератором number_generator(5). На каждой итерации мы выводим значение на экран.
"""
# Таким образом, генераторы позволяют создавать итерируемые объекты с помощью оператора yield, что облегчает работу
# с большими последовательностями данных,
# не загружая память.


# def some():
#     list_text = []
#     with open('text_1.txt', encoding='utf-8') as r:
#         for x in r:
#             list_text.append(x)
#     return


# def some():
#     with open('text_1.txt', encoding='utf-8') as r:
#             for x in r:
#                 yield x
# for i in some():
#     print(i.split())


# def some():
#     with open('text_1.txt', encoding='utf-8') as r:
#             for x in r:
#                 yield x
# p = some()
# print(p) # <generator object some at 0x000001F544A95E70>
# print(next(p)) # Строка текста
# print(next(p)) # с какой то
# print(next(p)) # информацией
# print(next(p)) # StopIteration


def some():
    with open("text_1.txt", encoding="utf-8") as r:
        for x in r:
            yield x


p = some()

for i in p:
    print(i)  # Строка текста
    # с какой то
    # информацией
